VARCHAR(0-65535)/CHAR(0-255)差別於可儲存長度差別之外。
VARCHAR的長度是不固定
的 EX:密碼,CHAR的長度是固定
的EX:電話。
當我們設置CHAR(4),代表儲存佔有空間為4BYTES,VARCHAR(4)儲存佔有空間為實際我們傳入值之長度
。
mysql> CREATE TABLE test1(a CHAR(4),b VARCHAR(4));
mysql> DESC test1;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| a | char(4) | YES | | NULL | |
| b | varchar(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
CHAR_LENGTH(a) 可獲取其字串之長度。
LENGTH(a) 可獲取其字串佔有之BYTE。
mysql> SELECT CHAR_LENGTH(a) , CHAR_LENGTH(b) FROM test1;
+----------------+----------------+
| CHAR_LENGTH(a) | CHAR_LENGTH(b) |
+----------------+----------------+
| 3 | 3 |
+----------------+----------------+
1 row in set (0.01 sec)
mysql> SELECT LENGTH(a) ,LENGTH(b) FROM test1;
+-----------+-----------+
| LENGTH(a) | LENGTH(b) |
+-----------+-----------+
| 3 | 3 |
+-----------+-----------+
1 row in set (0.00 sec)
BINARY(4),d VARBINARY(4)對應CHAR及VARCHAR,但較少用到。
差別在於BINARY在未滿設置的儲存空間會以\0補齊
,也就是0x00。
mysql> CREATE TABLE test2(c BINARY(4),d VARBINARY(4));
mysql> INSERT INTO test2 values("a ","a ");
mysql> DESC test2;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| c | binary(4) | YES | | NULL | |
| d | varbinary(4) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
mysql> SELECT LENGTH(c) FROM test2;
可發現BINARY儲存空間已被補齊。
+-----------+
| LENGTH(c) |
+-----------+
| 4 |
+-----------+
mysql> SELECT LENGTH(d) FROM test2;
+-----------+
| LENGTH(d) |
+-----------+
| 2 |
+-----------+
可以將BLOB視為儲存更大的VARBINARY。同樣,可以將TEXT視為儲存更大的VARCHAR。
由於少見且不方便DEMO,故就簡述帶過。
前面文章有介紹過,這邊也不多贅述。
mysql> CREATE TABLE shirts (
-> name VARCHAR(40),
-> size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
-> );
可以輸入對應ENUM的下標
來節省時間。
INSERT INTO shirts values("polo2","1"); (取第一個ENUM所設置的值)
利用ENUM特性可以限制特定資料值,而不會出現ENUM所設置的資料範圍之外的值。
mysql> INSERT INTO shirts values("polo2","big");
ERROR 1265 (01000): Data truncated for column 'size' at row 1
SET可以創建一個組合
,由我們所設置的值,來建立一個組合,並且以二進制為順序
,依序對應不同組合,如 000(0) 對應 " " 空字串, 001(1) 對應 "one" ,111(7) 對應 "one,two,three"。
mysql> CREATE TABLE test3(a SET('one','two','three'));
Query OK, 0 rows affected (0.04 sec)
mysql> DESC test3;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| a | set('one','two','three') | YES | | NULL | |
+-------+--------------------------+------+-----+---------+-------+
mysql> INSERT INTO test3 values(0);
mysql> INSERT INTO test3 values(1);
mysql> INSERT INTO test3 values(7);
mysql> SELECT * FROM test3;
+---------------+
| a |
+---------------+
| |
| one |
| one,two,three |
+---------------+
SET值中設置N個值,即可獲得2^N種組合。
今天假設我們需要改變資料之類型,並確保資料內的值不改變,可使用ALTER這個語法。
創建一個TABLE,並且插入值後。
mysql> CREATE TABLE user( username varchar(10) , password varchar(20) );
mysql> DESC user;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(10) | YES | | NULL | |
| password | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> INSERT INTO user(username , password) values ("jojo","12334455");
mysql> SELECT * FROM user;
+----------+----------+
| username | password |
+----------+----------+
| jojo | 12334455 |
+----------+----------+
1 row in set (0.00 sec)
我們利用ALTER改變資料之類型(只能改變為與值相符的類型,比如此例無法將資料類型改為DATE、INTEGER...)。可發現值並無改變,且資料類型已經改變。
mysql> ALTER TABLE user MODIFY username CHAR(20);
Query OK, 1 row affected (0.12 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM user;
+----------+----------+
| username | password |
+----------+----------+
| jojo | 12334455 |
+----------+----------+
mysql> DESC user;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | char(20) | YES | | NULL | |
| password | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+